🖥 ex — это инструмент для создания единого исполняемого файла .pex, который содержит всю вашу программу на Python и её зависимости. Это самодостаточная и переносимая среда выполнения, аналогичная virtualenv, но упакованная в один файл.
Зачем это нужно?
Простота развертывания: чтобы установить и запустить приложение, достаточно скопировать файл app.pex и запустить его — никакой дополнительной настройки.
Портируемость: один файл может включать сборки для разных платформ (Linux, macOS).
Изоляция зависимостей: все библиотеки (включая C‑расширения) уже находятся внутри, поэтому конфликтов версий нет.
Как пользоваться:
Устанавливаем сам инструмент:
pip install pex
Собираем .pex-файл:
pex requests -o fetch.pex --script=requests
После этого fetch.pex — это готовый исполняемый файл, который при запуске сразу импортирует и запускает библиотеку requests.
Интеграция с другими сборщиками:
Системы вроде Pants, Buck и {py}gradle могут автоматически собирать .pex-архивы из вашего кода.
Лицензия: Apache 2.0
▪ GitHub: https://github.com/pex-tool/pex
▪ Документация: https://docs.pex-tool.org/
@Python_Community_ru
Зачем это нужно?
Простота развертывания: чтобы установить и запустить приложение, достаточно скопировать файл app.pex и запустить его — никакой дополнительной настройки.
Портируемость: один файл может включать сборки для разных платформ (Linux, macOS).
Изоляция зависимостей: все библиотеки (включая C‑расширения) уже находятся внутри, поэтому конфликтов версий нет.
Как пользоваться:
Устанавливаем сам инструмент:
pip install pex
Собираем .pex-файл:
pex requests -o fetch.pex --script=requests
После этого fetch.pex — это готовый исполняемый файл, который при запуске сразу импортирует и запускает библиотеку requests.
Интеграция с другими сборщиками:
Системы вроде Pants, Buck и {py}gradle могут автоматически собирать .pex-архивы из вашего кода.
Лицензия: Apache 2.0
▪ GitHub: https://github.com/pex-tool/pex
▪ Документация: https://docs.pex-tool.org/
@Python_Community_ru
🖥 Новая функция в Python 3.14: t-строки — типобезопасные f-строки
Python 3.14 вводит t"..." — новый синтаксис для строк, который ориентирован на безопасность типов и интеграцию с различными системами шаблонов, такими как SQL, HTML и другие.
🔹 Что такое t-строка?
t"..." — это как f"...", но:
- интерполяция ограничена и контролируется;
- поддерживается строгое соответствие шаблону;
- переменные можно передавать явно, что предотвращает SQL-инъекции и XSS.
🔸 Пример:
name = "Alice"
greeting = t"Hello, {name}!" # t-строка
Вместо немедленной подстановки, как в f"...", t"..." создает шаблон с выражениями в качестве параметров.
🔐 Зачем это нужно?
✅ Обеспечение безопасности при генерации SQL, HTML, JSON
✅ Улучшение инструментов и проверки типов (посредством статического анализа)
✅ Контроль над контекстом исполнения (нельзя просто вставить переменную как есть — её нужно передать явно)
📦 Использование:
t-строки — это первый шаг к "template string literals", как в TypeScript.
Можно использовать с функциями:
def html(template: T[str]) -> SafeHTML:
...
html(t"{user_input}")
💡 Почему это важно?
Старый код:
f"SELECT * FROM users WHERE name = '{user_name}'"
может привести к SQL-инъекциям и XSS. t-строки являются безопасной альтернативой с встроенной защитой.
🛡 Пример: безопасный HTML
template = t"{user_input}"
html_output = html(template)
# <script>alert('bad')</script>
Функция html() может вернуть не просто строку, а полноценный HTMLElement. Больше никакой "грязи" — всё чисто и типобезопасно.
🔍 Работа с шаблоном
t-строки позволяют получить доступ к содержимому:
template = t"Hello {name}!"
template.strings # ("Hello ", "!")
template.values # (name,)
template.interpolations[0].format_spec # ">8"
Можно также вручную собрать шаблон:
Template("Hello ", Interpolation(value="World", expression="name"), "!")
🚀 Вывод:
t"..." — шаг к безопасным шаблонам и типизации строк в Python. Готовься к будущему Python — безопасному по умолчанию.
📌 Подробнее здесь (https://davepeck.org/2025/04/11/pythons-new-t-strings/)
@Python_Community_ru
Python 3.14 вводит t"..." — новый синтаксис для строк, который ориентирован на безопасность типов и интеграцию с различными системами шаблонов, такими как SQL, HTML и другие.
🔹 Что такое t-строка?
t"..." — это как f"...", но:
- интерполяция ограничена и контролируется;
- поддерживается строгое соответствие шаблону;
- переменные можно передавать явно, что предотвращает SQL-инъекции и XSS.
🔸 Пример:
name = "Alice"
greeting = t"Hello, {name}!" # t-строка
Вместо немедленной подстановки, как в f"...", t"..." создает шаблон с выражениями в качестве параметров.
🔐 Зачем это нужно?
✅ Обеспечение безопасности при генерации SQL, HTML, JSON
✅ Улучшение инструментов и проверки типов (посредством статического анализа)
✅ Контроль над контекстом исполнения (нельзя просто вставить переменную как есть — её нужно передать явно)
📦 Использование:
t-строки — это первый шаг к "template string literals", как в TypeScript.
Можно использовать с функциями:
def html(template: T[str]) -> SafeHTML:
...
html(t"{user_input}")
💡 Почему это важно?
Старый код:
f"SELECT * FROM users WHERE name = '{user_name}'"
может привести к SQL-инъекциям и XSS. t-строки являются безопасной альтернативой с встроенной защитой.
🛡 Пример: безопасный HTML
template = t"{user_input}"
html_output = html(template)
# <script>alert('bad')</script>
Функция html() может вернуть не просто строку, а полноценный HTMLElement. Больше никакой "грязи" — всё чисто и типобезопасно.
🔍 Работа с шаблоном
t-строки позволяют получить доступ к содержимому:
template = t"Hello {name}!"
template.strings # ("Hello ", "!")
template.values # (name,)
template.interpolations[0].format_spec # ">8"
Можно также вручную собрать шаблон:
Template("Hello ", Interpolation(value="World", expression="name"), "!")
🚀 Вывод:
t"..." — шаг к безопасным шаблонам и типизации строк в Python. Готовься к будущему Python — безопасному по умолчанию.
📌 Подробнее здесь (https://davepeck.org/2025/04/11/pythons-new-t-strings/)
@Python_Community_ru
This media is not supported in your browser
VIEW IN TELEGRAM
Zev 🔍
Это помощник для работы с терминалом на естественном языке.
Он помогает быстро находить нужные команды и сохранять их в избранное. Его простой и понятный интерфейс делает освоение терминала доступным даже для новичков.
pip install zev
📌 Github (https://github.com/dtnewman/zev)
@Python_Community_ru
Это помощник для работы с терминалом на естественном языке.
Он помогает быстро находить нужные команды и сохранять их в избранное. Его простой и понятный интерфейс делает освоение терминала доступным даже для новичков.
pip install zev
📌 Github (https://github.com/dtnewman/zev)
@Python_Community_ru
🖥 PDF Craft — это библиотека на Python, предназначенная для преобразования PDF (в первую очередь сканированных книг) в Markdown и EPUB, с использованием локальных AI-моделей и LLM для структурирования содержимого.
🌟 Основные возможности:
- Извлечение текста и макета. Используется комбинация DocLayout-YOLO и собственных алгоритмов для обнаружения и фильтрации заголовков, колонтитулов, сносок и номеров страниц.
- Локальный OCR. Распознаёт текст на странице с помощью OnnxOCR и поддерживает ускорение на GPU (CUDA).
- Определение порядка чтения. С помощью layoutreader создаётся поток текста в том порядке, который воспринимает человек.
- Конвертация в Markdown. Генерирует .md с относительными ссылками на изображения (иллюстрации, таблицы, формулы) в папке assets.
- Конвертация в EPUB. На основе промежуточных результатов OCR передаёт данные в LLM (рекомендуется DeepSeek) для создания оглавления, глав, исправления ошибок и добавления аннотаций.
Установка и требования: Python версии 3.10 или выше (рекомендуется 3.10.16).
Используйте команды pip install pdf-craft и pip install onnxruntime==1.21.0 (или onnxruntime-gpu==1.21.0 для CUDA).
Для EPUB-конвейера необходим доступ к LLM-сервису (например, DeepSeek).
🟡 GitHub (https://github.com/oomol-lab/pdf-craft)
@Python_Community_ru
🌟 Основные возможности:
- Извлечение текста и макета. Используется комбинация DocLayout-YOLO и собственных алгоритмов для обнаружения и фильтрации заголовков, колонтитулов, сносок и номеров страниц.
- Локальный OCR. Распознаёт текст на странице с помощью OnnxOCR и поддерживает ускорение на GPU (CUDA).
- Определение порядка чтения. С помощью layoutreader создаётся поток текста в том порядке, который воспринимает человек.
- Конвертация в Markdown. Генерирует .md с относительными ссылками на изображения (иллюстрации, таблицы, формулы) в папке assets.
- Конвертация в EPUB. На основе промежуточных результатов OCR передаёт данные в LLM (рекомендуется DeepSeek) для создания оглавления, глав, исправления ошибок и добавления аннотаций.
Установка и требования: Python версии 3.10 или выше (рекомендуется 3.10.16).
Используйте команды pip install pdf-craft и pip install onnxruntime==1.21.0 (или onnxruntime-gpu==1.21.0 для CUDA).
Для EPUB-конвейера необходим доступ к LLM-сервису (например, DeepSeek).
🟡 GitHub (https://github.com/oomol-lab/pdf-craft)
@Python_Community_ru
👾 FlexGet — это инструмент, который превращает рутинные задачи в автоматизированные рабочие процессы: от загрузки сериалов по RSS до организации медиатеки.
Модульная архитектура проекта особенно удобна. Базовый функционал включает более 150 плагинов для интеграции с qBittorrent, Plex и другими сервисами. При этом вся логика описывается с помощью декларативного подхода.
🤖 GitHub (https://github.com/Flexget/Flexget)
@Python_Community_ru
Модульная архитектура проекта особенно удобна. Базовый функционал включает более 150 плагинов для интеграции с qBittorrent, Plex и другими сервисами. При этом вся логика описывается с помощью декларативного подхода.
🤖 GitHub (https://github.com/Flexget/Flexget)
@Python_Community_ru
🔹 Тысяча гайдов для разработчиков в одном репозитории!
Разработчик из Твиттера собирал этот настоящий кладезь знаний целых 10 лет.
Внутри — буквально всё: от шпаргалок по горячим клавишам для ускорения работы до фундаментальных руководств по языкам программирования, веб-разработке, созданию ПО, сетям, безопасности и многому другому.
Что там есть:
📚 Инструменты для работы с CLI, GUI, вебом и локальными сетями.
📦 Списки всех актуальных фреймворков и библиотек 2025 года.
🛡 Гайды по тестированию и взлому приложений.
🔥 Шпаргалки по командной строке.
📰 Огромная подборка блогов, YouTube-каналов, онлайн-СМИ и журналов, чтобы быть в курсе и не терять хватку.
Фолиант знаний ждёт тебя!
📌 Github (https://github.com/trimstray/the-book-of-secret-knowledge?tab=readme-ov-file#manualshowtostutorials-toc)
@Python_Community_ru
Разработчик из Твиттера собирал этот настоящий кладезь знаний целых 10 лет.
Внутри — буквально всё: от шпаргалок по горячим клавишам для ускорения работы до фундаментальных руководств по языкам программирования, веб-разработке, созданию ПО, сетям, безопасности и многому другому.
Что там есть:
📚 Инструменты для работы с CLI, GUI, вебом и локальными сетями.
📦 Списки всех актуальных фреймворков и библиотек 2025 года.
🛡 Гайды по тестированию и взлому приложений.
🔥 Шпаргалки по командной строке.
📰 Огромная подборка блогов, YouTube-каналов, онлайн-СМИ и журналов, чтобы быть в курсе и не терять хватку.
Фолиант знаний ждёт тебя!
📌 Github (https://github.com/trimstray/the-book-of-secret-knowledge?tab=readme-ov-file#manualshowtostutorials-toc)
@Python_Community_ru
🖥 Задача: "Кэширование и ленивые вычисления в многопоточном окружении"
🔜 Условие:
Вам необходимо создать декоратор @thread_safe_cached, который:
- Кэширует результат вызова функции по её аргументам (аналогично functools.lru_cache, но реализованный самостоятельно).
- Если несколько потоков одновременно вызывают функцию с одинаковыми аргументами:
- Только один поток фактически выполняет функцию,
- Остальные ждут, пока результат будет вычислен, и получают готовый результат.
- Кэш никогда не очищается (неограниченный размер).
Ограничения:
- Решение должно работать для любых функций и аргументов (должны быть хэшируемыми).
- Нельзя использовать готовый functools.lru_cache или другие библиотеки кэширования.
- Необходимо обеспечить корректную работу в многопоточной среде без гонок данных.
---
▪️ Подсказки:
- Для кэширования можно использовать словарь с ключами по аргументам (`*args`, `**kwargs`).
- Для защиты доступа к кэшу потребуется threading.Lock.
- Для ожидания завершения вычислений другими потоками можно применять threading.Event.
- Продумайте, как отличить "результат уже посчитан" от "результат в процессе вычисления".
---
▪️ Что оценивается:
- Умение работать с многопоточностью в Python.
- Правильная организация кэширования.
- Чистота и лаконичность кода.
- Умение обрабатывать тонкие случаи, например, одновременные вызовы.
---
▪️ Разбор возможного решения:
Основная идея:
- Создать кэш cache: Dict[Key, Result].
- Одновременно создать словарь "ожиданий" in_progress: Dict[Key, threading.Event].
- Если кто-то начал вычисление значения:
- Остальные ждут Event, пока он не будет установлен.
Пример реализации:
```python
import threading
import functools
def thread_safe_cached(func):
cache = {}
in_progress = {}
lock = threading.Lock()
@functools.wraps(func)
def wrapper(*args, **kwargs):
key = (args, frozenset(kwargs.items()))
with lock:
if key in cache:
return cache[key]
if key not in in_progress:
in_progress[key] = threading.Event()
in_progress[key].clear()
creator = True
else:
creator = False
if creator:
try:
result = func(*args, **kwargs)
with lock:
cache[key] = result
finally:
in_progress[key].set()
with lock:
del in_progress[key]
return result
else:
in_progress[key].wait()
with lock:
return cache[key]
return wrapper
```
---
▪️ Пояснения к коду:
- При первом вызове для новых аргументов поток создаёт Event и начинает вычислять результат.
- Остальные потоки видят Event и вызывают wait(), пока первый поток не установит set().
- Как только результат вычислен, Event сигнализирует всем ждущим потокам, что данные готовы.
- Доступ к cache и in_progress защищён через lock для предотвращения гонок.
---
▪️ Возможные подводные камни:
- ❗ Если не удалять Event из in_progress, кэш постепенно заполнится мусором.
- ❗ Если произойдёт ошибка внутри func, необходимо всё равно освободить Event, иначе потоки будут бесконечно ждать.
- ❗ Нельзя удерживать lock во время выполнения тяжёлой функции func, иначе все потоки будут блокироваться.
---
▪️ Вопросы на собеседовании по этой задаче:
- Как изменить реализацию, чтобы кэш имел ограничение по размеру (например, максимум 1000 элементов)?
- Как адаптировать декоратор под асинхронные функции (`async def`)?
- Что произойдет, если func иногда вызывает исключения? Как кэшировать ошибки или не кэшировать их?
- Как изменить реализацию так, чтобы кэш удалял устаревшие данные через TTL (Time-To-Live)?
@Python_Community_ru
🔜 Условие:
Вам необходимо создать декоратор @thread_safe_cached, который:
- Кэширует результат вызова функции по её аргументам (аналогично functools.lru_cache, но реализованный самостоятельно).
- Если несколько потоков одновременно вызывают функцию с одинаковыми аргументами:
- Только один поток фактически выполняет функцию,
- Остальные ждут, пока результат будет вычислен, и получают готовый результат.
- Кэш никогда не очищается (неограниченный размер).
Ограничения:
- Решение должно работать для любых функций и аргументов (должны быть хэшируемыми).
- Нельзя использовать готовый functools.lru_cache или другие библиотеки кэширования.
- Необходимо обеспечить корректную работу в многопоточной среде без гонок данных.
---
▪️ Подсказки:
- Для кэширования можно использовать словарь с ключами по аргументам (`*args`, `**kwargs`).
- Для защиты доступа к кэшу потребуется threading.Lock.
- Для ожидания завершения вычислений другими потоками можно применять threading.Event.
- Продумайте, как отличить "результат уже посчитан" от "результат в процессе вычисления".
---
▪️ Что оценивается:
- Умение работать с многопоточностью в Python.
- Правильная организация кэширования.
- Чистота и лаконичность кода.
- Умение обрабатывать тонкие случаи, например, одновременные вызовы.
---
▪️ Разбор возможного решения:
Основная идея:
- Создать кэш cache: Dict[Key, Result].
- Одновременно создать словарь "ожиданий" in_progress: Dict[Key, threading.Event].
- Если кто-то начал вычисление значения:
- Остальные ждут Event, пока он не будет установлен.
Пример реализации:
```python
import threading
import functools
def thread_safe_cached(func):
cache = {}
in_progress = {}
lock = threading.Lock()
@functools.wraps(func)
def wrapper(*args, **kwargs):
key = (args, frozenset(kwargs.items()))
with lock:
if key in cache:
return cache[key]
if key not in in_progress:
in_progress[key] = threading.Event()
in_progress[key].clear()
creator = True
else:
creator = False
if creator:
try:
result = func(*args, **kwargs)
with lock:
cache[key] = result
finally:
in_progress[key].set()
with lock:
del in_progress[key]
return result
else:
in_progress[key].wait()
with lock:
return cache[key]
return wrapper
```
---
▪️ Пояснения к коду:
- При первом вызове для новых аргументов поток создаёт Event и начинает вычислять результат.
- Остальные потоки видят Event и вызывают wait(), пока первый поток не установит set().
- Как только результат вычислен, Event сигнализирует всем ждущим потокам, что данные готовы.
- Доступ к cache и in_progress защищён через lock для предотвращения гонок.
---
▪️ Возможные подводные камни:
- ❗ Если не удалять Event из in_progress, кэш постепенно заполнится мусором.
- ❗ Если произойдёт ошибка внутри func, необходимо всё равно освободить Event, иначе потоки будут бесконечно ждать.
- ❗ Нельзя удерживать lock во время выполнения тяжёлой функции func, иначе все потоки будут блокироваться.
---
▪️ Вопросы на собеседовании по этой задаче:
- Как изменить реализацию, чтобы кэш имел ограничение по размеру (например, максимум 1000 элементов)?
- Как адаптировать декоратор под асинхронные функции (`async def`)?
- Что произойдет, если func иногда вызывает исключения? Как кэшировать ошибки или не кэшировать их?
- Как изменить реализацию так, чтобы кэш удалял устаревшие данные через TTL (Time-To-Live)?
@Python_Community_ru
Что выведет данный код при запуске на Python 3.10+ (например, 3.11)?
📌 Подсказка: Обратите внимание на порядок проверок, на то, какие атрибуты попадают в others, и на использование __match_args__.
Ответ:
Automatic mode
Mode manual, другие ключи: ['threshold', 'debug']
Низкий порог 0
Краткое пояснение:
Для первого объекта (mode="auto", threshold=10) срабатывает первый case Config(mode="auto") → Automatic mode.
Для второго (mode="manual", threshold=5, debug=True) первый не совпадает, второй с threshold.
@Python_Community_ru
📌 Подсказка: Обратите внимание на порядок проверок, на то, какие атрибуты попадают в others, и на использование __match_args__.
Ответ:
Automatic mode
Mode manual, другие ключи: ['threshold', 'debug']
Низкий порог 0
Краткое пояснение:
Для первого объекта (mode="auto", threshold=10) срабатывает первый case Config(mode="auto") → Automatic mode.
Для второго (mode="manual", threshold=5, debug=True) первый не совпадает, второй с threshold.
@Python_Community_ru
🖥 PyXL — это аппаратный процессор, который выполняет Python-код без использования интерпретатора.
Создатель представил PyXL — уникальный процессор, способный запускать Python-программы напрямую, без необходимости в традиционном интерпретаторе или виртуальной машине.
Структура PyXL:
Python → байткод CPython → собственный набор команд для непосредственного выполнения на аппаратном уровне.
Он построен на основе стековой модели, полностью конвейерный и сохраняет динамическую типизацию Python без ограничений, связанных со статическими типами.
⏩ Тест производительности GPIO:
PyXL переключает GPIO с задержкой всего 480 наносекунд.
Для сравнения: MicroPython на Pyboard требует 14–25 микросекунд, несмотря на более высокую частоту (168 МГц против 100 МГц у PyXL).
Создатель самостоятельно разработал:
Компилятор, линкер и генератор кода,
А также аппаратную реализацию процессора.
Этот проект показывает, что возможно аппаратное исполнение Python с высокой скоростью и без ущерба для гибкости языка. Полные технические детали будут раскрыты на PyCon 2025.
🎬 Демонстрация и подробная информация: https://runpyxl.com/gpio
@Python_Community_ru
Создатель представил PyXL — уникальный процессор, способный запускать Python-программы напрямую, без необходимости в традиционном интерпретаторе или виртуальной машине.
Структура PyXL:
Python → байткод CPython → собственный набор команд для непосредственного выполнения на аппаратном уровне.
Он построен на основе стековой модели, полностью конвейерный и сохраняет динамическую типизацию Python без ограничений, связанных со статическими типами.
⏩ Тест производительности GPIO:
PyXL переключает GPIO с задержкой всего 480 наносекунд.
Для сравнения: MicroPython на Pyboard требует 14–25 микросекунд, несмотря на более высокую частоту (168 МГц против 100 МГц у PyXL).
Создатель самостоятельно разработал:
Компилятор, линкер и генератор кода,
А также аппаратную реализацию процессора.
Этот проект показывает, что возможно аппаратное исполнение Python с высокой скоростью и без ущерба для гибкости языка. Полные технические детали будут раскрыты на PyCon 2025.
🎬 Демонстрация и подробная информация: https://runpyxl.com/gpio
@Python_Community_ru
🖥 Microsoft: искусственный интеллект уже пишет до 30 % кода
На конференции LlamaCon генеральный директор Microsoft Сатья Наделла сообщил, что от 20 % до 30 % кода в репозиториях компании сейчас создается с помощью программного обеспечения, то есть с использованием искусственного интеллекта.
## Основные моменты
- Зависимость от языка программирования. Лучшие результаты генерации получаются на Python, а на C++ результаты хуже.
- Внедрение на всех этапах. Искусственный интеллект используется не только для создания чернового кода, но и для его проверки.
- Сравнение с конкурентами. Google уже заявляет о более чем 30 % кода, сгенерированного ИИ, а Meta прогнозирует до 50 % при разработке своих языковых моделей.
- Долгосрочный прогноз. По мнению технического директора Microsoft, к 2030 году доля кода, созданного ИИ, может достигнуть 95 %.
- Ограничения метрик. Пока не совсем ясно, что именно включается в понятие «ИИ-код» (автодополнение, шаблоны, бизнес-логика), поэтому эти цифры нужно воспринимать с осторожностью.
## Почему это важно
1. Ускорение процесса разработки. Рутинные задачи автоматизируются, и разработчики могут больше времени уделять архитектуре.
2. Повышение качества. Автоматическая проверка помогает быстрее находить ошибки, но требует тщательной проверки.
3. Риски безопасности. Сгенерированный код необходимо дополнительно анализировать на наличие уязвимостей.
4. Изменение ролей. Разработчики всё чаще становятся архитекторами и аудиторами, а не просто создателями кода.
@Python_Community_ru
На конференции LlamaCon генеральный директор Microsoft Сатья Наделла сообщил, что от 20 % до 30 % кода в репозиториях компании сейчас создается с помощью программного обеспечения, то есть с использованием искусственного интеллекта.
## Основные моменты
- Зависимость от языка программирования. Лучшие результаты генерации получаются на Python, а на C++ результаты хуже.
- Внедрение на всех этапах. Искусственный интеллект используется не только для создания чернового кода, но и для его проверки.
- Сравнение с конкурентами. Google уже заявляет о более чем 30 % кода, сгенерированного ИИ, а Meta прогнозирует до 50 % при разработке своих языковых моделей.
- Долгосрочный прогноз. По мнению технического директора Microsoft, к 2030 году доля кода, созданного ИИ, может достигнуть 95 %.
- Ограничения метрик. Пока не совсем ясно, что именно включается в понятие «ИИ-код» (автодополнение, шаблоны, бизнес-логика), поэтому эти цифры нужно воспринимать с осторожностью.
## Почему это важно
1. Ускорение процесса разработки. Рутинные задачи автоматизируются, и разработчики могут больше времени уделять архитектуре.
2. Повышение качества. Автоматическая проверка помогает быстрее находить ошибки, но требует тщательной проверки.
3. Риски безопасности. Сгенерированный код необходимо дополнительно анализировать на наличие уязвимостей.
4. Изменение ролей. Разработчики всё чаще становятся архитекторами и аудиторами, а не просто создателями кода.
@Python_Community_ru
This media is not supported in your browser
VIEW IN TELEGRAM
🖥 TUIFIManager
Это файловый менеджер с терминальным интерфейсом, ориентированный на termux и работающий на разных платформах. Он создан для работы с проектом Uni-Curses.
📌 Как пользоваться:
Запустите tuifi в терминале или добавьте его в один из своих проектов Uni-Curses в качестве компонента, например:
from TUIFIManager import *
Установка:
sudo pip3 install tuifimanager --upgrade
pip3 install TUIFIManager --upgrade
https://github.com/GiorgosXou/TUIFIManager
@Python_Community_ru
Это файловый менеджер с терминальным интерфейсом, ориентированный на termux и работающий на разных платформах. Он создан для работы с проектом Uni-Curses.
📌 Как пользоваться:
Запустите tuifi в терминале или добавьте его в один из своих проектов Uni-Curses в качестве компонента, например:
from TUIFIManager import *
Установка:
sudo pip3 install tuifimanager --upgrade
pip3 install TUIFIManager --upgrade
https://github.com/GiorgosXou/TUIFIManager
@Python_Community_ru
🖥 Задача (с подвохом). Какой результат выдаст этот код?
def extend_list(val, lst=[]):
lst.append(val)
return lst
# Первый вызов: используется список по умолчанию
list1 = extend_list(10)
# Второй вызов: передаём новый пустой список
list2 = extend_list(123, [])
# Третий вызов: снова используется список по умолчанию
list3 = extend_list('a')
print('list1 =', list1)
print('list2 =', list2)
print('list3 =', list3)
🧩 Объяснение
Как работает список по умолчанию
В объявлении функции lst=[] создаётся один список при определении функции, и он используется повторно во всех вызовах, где аргумент lst не передан.
Первый вызов
list1 = extend_list(10)
Параметр lst не передан → используется дефолтный список.
Добавляем 10.
В результате list1 становится [10].
Второй вызов
list2 = extend_list(123, [])
Передаём новый пустой список [].
В этот список добавляется 123.
В итоге list2 становится [123].
Третий вызов
list3 = extend_list('a')
Опять не передан lst → используется тот же дефолтный список, в который уже добавлен 10.
Добавляем 'a'.
Дефолтный список теперь [10, 'a'], и list3 ссылается на этот же список.
Окончательный вывод программы:
list1 = [10, 'a']
list2 = [123]
list3 = [10, 'a']
Обратите внимание, что list1 и list3 — это один и тот же дефолтный список, поэтому изменения сохраняются между вызовами.
@Python_Community_ru
def extend_list(val, lst=[]):
lst.append(val)
return lst
# Первый вызов: используется список по умолчанию
list1 = extend_list(10)
# Второй вызов: передаём новый пустой список
list2 = extend_list(123, [])
# Третий вызов: снова используется список по умолчанию
list3 = extend_list('a')
print('list1 =', list1)
print('list2 =', list2)
print('list3 =', list3)
🧩 Объяснение
Как работает список по умолчанию
В объявлении функции lst=[] создаётся один список при определении функции, и он используется повторно во всех вызовах, где аргумент lst не передан.
Первый вызов
list1 = extend_list(10)
Параметр lst не передан → используется дефолтный список.
Добавляем 10.
В результате list1 становится [10].
Второй вызов
list2 = extend_list(123, [])
Передаём новый пустой список [].
В этот список добавляется 123.
В итоге list2 становится [123].
Третий вызов
list3 = extend_list('a')
Опять не передан lst → используется тот же дефолтный список, в который уже добавлен 10.
Добавляем 'a'.
Дефолтный список теперь [10, 'a'], и list3 ссылается на этот же список.
Окончательный вывод программы:
list1 = [10, 'a']
list2 = [123]
list3 = [10, 'a']
Обратите внимание, что list1 и list3 — это один и тот же дефолтный список, поэтому изменения сохраняются между вызовами.
@Python_Community_ru
👣 Pyrefly — это новая высокопроизводительная система статической типизации и платформа IDE для Python, созданная командой Facebook на языке Rust.
Основное:
🔍 Продолжатель Pyre
Pyrefly разрабатывается как следующая версия типового проверяльщика Pyre от Meta, с акцентом на скорость, модульность и возможность генерации «типизированного» AST.
🚀 Написано на Rust
Большая часть кода реализована на Rust для обеспечения лучшей безопасности памяти и поддержки конкурентности. Примерно 1 % кода написано на Python и около 6 % на TypeScript (для веб-интерфейса и LSP).
⚙️ Проверка в три шага
Сбор экспортируемых элементов каждого модуля (рекурсивное разрешение всех import *)
Преобразование кода в набор «байндингов» (definitions, uses, anon) с учётом потоковых типов
Решение этих байндингов с использованием потоковых типов и phi-функций при ветвлениях и рекурсии
💡 Масштабируемость и инкрементальность
Модульно-ориентированный подход: проверка каждого модуля целиком, с возможностью параллельного запуска и меньшей сложностью по сравнению с тонкозернистыми DAG-алгоритмами.
🛠️ Интеграция и сборка
Для разработчиков на Rust: команды cargo build, cargo test
Во внутренних проектах Meta: запуск через Buck2 (buck2 run pyrefly -- check file.py)
Для PyPI: сборка wheel-пакетов через Maturin (pip install maturin && maturin build)
📡 Функции IDE и LSP
Поддерживается Language Server Protocol, обеспечивающий автодополнение, переход к определению и интерактивную отладку в редакторах.
📆 Планы
Полная замена Pyre намечена к концу 2025 года с еженедельными стабильными релизами на PyPI.
📜 Лицензия
MIT — свободное использование и участие в развитии проекта приветствуются.
🔜 Подробнее узнать и принять участие можно в репозитории на Github (https://github.com/facebook/pyrefly)
@Python_Community_ru
Основное:
🔍 Продолжатель Pyre
Pyrefly разрабатывается как следующая версия типового проверяльщика Pyre от Meta, с акцентом на скорость, модульность и возможность генерации «типизированного» AST.
🚀 Написано на Rust
Большая часть кода реализована на Rust для обеспечения лучшей безопасности памяти и поддержки конкурентности. Примерно 1 % кода написано на Python и около 6 % на TypeScript (для веб-интерфейса и LSP).
⚙️ Проверка в три шага
Сбор экспортируемых элементов каждого модуля (рекурсивное разрешение всех import *)
Преобразование кода в набор «байндингов» (definitions, uses, anon) с учётом потоковых типов
Решение этих байндингов с использованием потоковых типов и phi-функций при ветвлениях и рекурсии
💡 Масштабируемость и инкрементальность
Модульно-ориентированный подход: проверка каждого модуля целиком, с возможностью параллельного запуска и меньшей сложностью по сравнению с тонкозернистыми DAG-алгоритмами.
🛠️ Интеграция и сборка
Для разработчиков на Rust: команды cargo build, cargo test
Во внутренних проектах Meta: запуск через Buck2 (buck2 run pyrefly -- check file.py)
Для PyPI: сборка wheel-пакетов через Maturin (pip install maturin && maturin build)
📡 Функции IDE и LSP
Поддерживается Language Server Protocol, обеспечивающий автодополнение, переход к определению и интерактивную отладку в редакторах.
📆 Планы
Полная замена Pyre намечена к концу 2025 года с еженедельными стабильными релизами на PyPI.
📜 Лицензия
MIT — свободное использование и участие в развитии проекта приветствуются.
🔜 Подробнее узнать и принять участие можно в репозитории на Github (https://github.com/facebook/pyrefly)
@Python_Community_ru
🚀 Jittor — это фреймворк, который применяет JIT-компиляцию и мета-операторы для оптимизации вычислений непосредственно во время работы программы.
Этот проект объединяет удобство Python-интерфейса с эффективной компиляцией на C++/CUDA на низком уровне. В отличие от классических графовых методов, он динамически компилирует операции с учётом конкретной модели, что может значительно ускорить обработку сложных нейронных сетей.
🤖 GitHub (https://github.com/Jittor/jittor)
@Python_Community_ru
Этот проект объединяет удобство Python-интерфейса с эффективной компиляцией на C++/CUDA на низком уровне. В отличие от классических графовых методов, он динамически компилирует операции с учётом конкретной модели, что может значительно ускорить обработку сложных нейронных сетей.
🤖 GitHub (https://github.com/Jittor/jittor)
@Python_Community_ru
✍️ novelWriter — это простой и минималистичный редактор для писателей с поддержкой Markdown. В проекте применяется облегчённый синтаксис, основанный на Markdown, а все данные сохраняются в обычных текстовых файлах, что делает его удобным для использования с системами контроля версий.
Основное внимание инструмент уделяет простоте и стабильности. Вместо использования проприетарных форматов применяется чистый текст с метаданными в формате JSON. Редактор создан на Python с применением Qt6 и работает на всех популярных операционных системах. При этом проект открыт для всех и принимает вклады, особенно в части переводов через платформу Crowdin.
🤖 GitHub (https://github.com/vkbo/novelWriter)
@Python_Community_ru
Основное внимание инструмент уделяет простоте и стабильности. Вместо использования проприетарных форматов применяется чистый текст с метаданными в формате JSON. Редактор создан на Python с применением Qt6 и работает на всех популярных операционных системах. При этом проект открыт для всех и принимает вклады, особенно в части переводов через платформу Crowdin.
🤖 GitHub (https://github.com/vkbo/novelWriter)
@Python_Community_ru
🔐 Что такое шифрование DES и как оно работает?
💡 DES (Data Encryption Standard) — это симметричный алгоритм шифрования, который был создан в 1970-х годах. Он использует один и тот же ключ и для шифрования, и для расшифровки, поэтому ключ необходимо хранить в секрете.
Длина ключа составляет 56 бит.
Данные обрабатываются блоками по 64 бита.
Алгоритм основан на 16 раундах перестановок и подстановок.
Несмотря на то, что DES устарел из-за своей уязвимости (его можно взломать перебором за несколько часов), он до сих пор применятся в учебных целях и в некоторых старых системах.
🐍 Пример использования DES на Python
Для работы с DES в Python можно использовать библиотеку PyCryptodome. Вот пример простого шифрования текста:
from Crypto.Cipher import DES
from Crypto.Util.Padding import pad, unpad
# Ключ должен быть ровно 8 байт
key = b'8bytekey'
cipher = DES.new(key, DES.MODE_ECB)
data = b'HelloWorld123' # Длина должна быть кратной 8, иначе требуется дополнение
padded_data = pad(data, 8)
encrypted = cipher.encrypt(padded_data)
print("Зашифрованные данные:", encrypted)
# Расшифровка
decrypted = unpad(cipher.decrypt(encrypted), 8)
print("Расшифрованные данные:", decrypted)
✅ Важно:
Ключ должен содержать ровно 8 байт (DES использует 64-битный ключ, но 8 бит из них предназначены для контроля чётности).
Данные должны быть кратны 8 байтам, поэтому часто применяется дополнение (padding).
⚠️ Почему DES больше не рекомендуют использовать?
Из-за небольшого размера ключа его легко взломать современными вычислительными мощностями.
Он уязвим к различным атакам, например, дифференциальному криптоанализу.
Сегодня вместо DES чаще применяют AES (Advanced Encryption Standard), который более безопасен и быстрее.
✍️ Вывод
Шифрование — это важный инструмент для защиты данных. DES является классическим примером симметричного шифрования, но в настоящее время он используется в основном для обучения или для работы с устаревшими системами. Для надежной защиты лучше выбирать современные алгоритмы, такие как AES.
@Python_Community_ru
💡 DES (Data Encryption Standard) — это симметричный алгоритм шифрования, который был создан в 1970-х годах. Он использует один и тот же ключ и для шифрования, и для расшифровки, поэтому ключ необходимо хранить в секрете.
Длина ключа составляет 56 бит.
Данные обрабатываются блоками по 64 бита.
Алгоритм основан на 16 раундах перестановок и подстановок.
Несмотря на то, что DES устарел из-за своей уязвимости (его можно взломать перебором за несколько часов), он до сих пор применятся в учебных целях и в некоторых старых системах.
🐍 Пример использования DES на Python
Для работы с DES в Python можно использовать библиотеку PyCryptodome. Вот пример простого шифрования текста:
from Crypto.Cipher import DES
from Crypto.Util.Padding import pad, unpad
# Ключ должен быть ровно 8 байт
key = b'8bytekey'
cipher = DES.new(key, DES.MODE_ECB)
data = b'HelloWorld123' # Длина должна быть кратной 8, иначе требуется дополнение
padded_data = pad(data, 8)
encrypted = cipher.encrypt(padded_data)
print("Зашифрованные данные:", encrypted)
# Расшифровка
decrypted = unpad(cipher.decrypt(encrypted), 8)
print("Расшифрованные данные:", decrypted)
✅ Важно:
Ключ должен содержать ровно 8 байт (DES использует 64-битный ключ, но 8 бит из них предназначены для контроля чётности).
Данные должны быть кратны 8 байтам, поэтому часто применяется дополнение (padding).
⚠️ Почему DES больше не рекомендуют использовать?
Из-за небольшого размера ключа его легко взломать современными вычислительными мощностями.
Он уязвим к различным атакам, например, дифференциальному криптоанализу.
Сегодня вместо DES чаще применяют AES (Advanced Encryption Standard), который более безопасен и быстрее.
✍️ Вывод
Шифрование — это важный инструмент для защиты данных. DES является классическим примером симметричного шифрования, но в настоящее время он используется в основном для обучения или для работы с устаревшими системами. Для надежной защиты лучше выбирать современные алгоритмы, такие как AES.
@Python_Community_ru
👩💻 datasketch (https://github.com/ekzhu/datasketch) — это библиотека на Python, которая реализует вероятностные структуры данных для оптимизации работы с большими массивами информации!
🌟 Основные функции включают оценку сходства Jaccard с использованием MinHash и его взвешенной версии, а также подсчет количества уникальных элементов с помощью HyperLogLog и HyperLogLog++. Эти структуры данных позволяют быстро и с минимальным расходом памяти выполнять такие задачи, как поиск похожих элементов и подсчет уникальных объектов.
🔐 Лицензия: MIT
🖥 Github (https://github.com/ekzhu/datasketch)
@Python_Community_ru
🌟 Основные функции включают оценку сходства Jaccard с использованием MinHash и его взвешенной версии, а также подсчет количества уникальных элементов с помощью HyperLogLog и HyperLogLog++. Эти структуры данных позволяют быстро и с минимальным расходом памяти выполнять такие задачи, как поиск похожих элементов и подсчет уникальных объектов.
🔐 Лицензия: MIT
🖥 Github (https://github.com/ekzhu/datasketch)
@Python_Community_ru
🛠 Werkzeug — это набор инструментов для WSGI-приложений на Python.
Хотя все обсуждают Flask, его основа — библиотека Werkzeug — остается менее заметной. Этот middleware-инструмент лежит в базе многих Python-фреймворков, обеспечивая основные функции для работы с HTTP-запросами, маршрутизацией и сессиями без навязывания конкретной архитектуры.
В Werkzeug отсутствуют ORM и шаблонизатор, но присутствуют:
▪️Интерактивный отладчик с REPL прямо в браузере
▪️Гибкая система маршрутизации (позже использованная в Flask)
▪️WSGI-сервер для разработки с поддержкой горячей перезагрузки
🤖 GitHub (https://github.com/pallets/werkzeug)
@Python_Community_ru
Хотя все обсуждают Flask, его основа — библиотека Werkzeug — остается менее заметной. Этот middleware-инструмент лежит в базе многих Python-фреймворков, обеспечивая основные функции для работы с HTTP-запросами, маршрутизацией и сессиями без навязывания конкретной архитектуры.
В Werkzeug отсутствуют ORM и шаблонизатор, но присутствуют:
▪️Интерактивный отладчик с REPL прямо в браузере
▪️Гибкая система маршрутизации (позже использованная в Flask)
▪️WSGI-сервер для разработки с поддержкой горячей перезагрузки
🤖 GitHub (https://github.com/pallets/werkzeug)
@Python_Community_ru
📡 FISSURE — это фреймворк, предназначенный для анализа и обратного проектирования радиосигналов.
Этот проект с открытым исходным кодом объединяет различные инструменты для работы с RF-сигналами: от их обнаружения и классификации до проведения атак и автоматизированного тестирования.
Программа поддерживает популярное SDR-оборудование и позволяет создавать распределённые сенсорные узлы для задач радиомониторинга. Проект активно развивается, и в 2024 году в него добавили анализ Z-Wave и автоматические триггеры для проведения атак.
🤖 GitHub (https://github.com/ainfosec/FISSURE)
@Python_Community_ru
Этот проект с открытым исходным кодом объединяет различные инструменты для работы с RF-сигналами: от их обнаружения и классификации до проведения атак и автоматизированного тестирования.
Программа поддерживает популярное SDR-оборудование и позволяет создавать распределённые сенсорные узлы для задач радиомониторинга. Проект активно развивается, и в 2024 году в него добавили анализ Z-Wave и автоматические триггеры для проведения атак.
🤖 GitHub (https://github.com/ainfosec/FISSURE)
@Python_Community_ru
🐍 Задача с подвохом: Декораторы и изменяемые объекты
Условие:
Что выведет следующий код и почему?
def memoize(fn):
cache = {}
def wrapper(arg):
if arg in cache:
print("Из кэша")
return cache[arg]
else:
result = fn(arg)
cache[arg] = result
return result
return wrapper
@memoize
def add_to_list(val, lst=[]):
lst.append(val)
return lst
res1 = add_to_list(1)
res2 = add_to_list(2)
res3 = add_to_list(1)
print(res1)
print(res2)
print(res3)
❓ Вопрос:
Что именно выведется? В чём здесь двойная ловушка?
🔍 Анализ:
Сначала кажется, что:
1. add_to_list(1) вернёт [1].
2. add_to_list(2) вернёт [2].
3. add_to_list(1) либо вызовет функцию снова, либо вернёт результат из кэша.
Но есть два подвоха:
Подвох №1: изменяемый аргумент по умолчанию
Аргумент lst=[] создаётся один раз при определении функции. Все вызовы без передачи списка будут использовать один и тот же список.
Подвох №2: кэширование по ключу
Декоратор memoize сохраняет результат в кэше по ключу arg. Но функция возвращает список, который изменяется при каждом вызове. Даже если результат берётся из кэша, вы получите ссылку на тот же список, который менялся между вызовами!
🧮 Что реально произойдёт:
- `res1 = add_to_list(1)` → функция вызвана, список становится `[1]`.
- `res2 = add_to_list(2)` → функция вызвана снова с другим аргументом, список теперь `[1, 2]`.
- `res3 = add_to_list(1)` → аргумент `1` есть в кэше, сработает ветка `print("Из кэша")`, и вернётся ссылка на тот же изменённый список.
🔢 Итог:
```
[1, 2]
[1, 2]
Из кэша
[1, 2]
```
Все переменные указывают на один и тот же изменённый список.
💥 Почему это важно:
1️⃣ Изменяемые аргументы по умолчанию сохраняются между вызовами функции.
2️⃣ Кэширование изменяемых объектов может привести к неожиданным результатам: возвращается не неизменяемый результат, а ссылка на объект, который может изменяться позже.
🛡️ Как исправить:
1️⃣ Использовать `lst=None` и создавать новый список внутри функции:
```python
def add_to_list(val, lst=None):
if lst is None:
lst = []
lst.append(val)
return lst
```
2️⃣ Если кэшировать изменяемые объекты, лучше возвращать их копии:
```python
import copy
cache[arg] = copy.deepcopy(result)
```
✅ Итог:
Декораторы вместе с изменяемыми аргументами — это ловушка даже для опытных программистов. Особенно, если изменяемые объекты кэшируются и потом меняются за кулисами.
@Python_Community_ru
Условие:
Что выведет следующий код и почему?
def memoize(fn):
cache = {}
def wrapper(arg):
if arg in cache:
print("Из кэша")
return cache[arg]
else:
result = fn(arg)
cache[arg] = result
return result
return wrapper
@memoize
def add_to_list(val, lst=[]):
lst.append(val)
return lst
res1 = add_to_list(1)
res2 = add_to_list(2)
res3 = add_to_list(1)
print(res1)
print(res2)
print(res3)
❓ Вопрос:
Что именно выведется? В чём здесь двойная ловушка?
🔍 Анализ:
Сначала кажется, что:
1. add_to_list(1) вернёт [1].
2. add_to_list(2) вернёт [2].
3. add_to_list(1) либо вызовет функцию снова, либо вернёт результат из кэша.
Но есть два подвоха:
Подвох №1: изменяемый аргумент по умолчанию
Аргумент lst=[] создаётся один раз при определении функции. Все вызовы без передачи списка будут использовать один и тот же список.
Подвох №2: кэширование по ключу
Декоратор memoize сохраняет результат в кэше по ключу arg. Но функция возвращает список, который изменяется при каждом вызове. Даже если результат берётся из кэша, вы получите ссылку на тот же список, который менялся между вызовами!
🧮 Что реально произойдёт:
- `res1 = add_to_list(1)` → функция вызвана, список становится `[1]`.
- `res2 = add_to_list(2)` → функция вызвана снова с другим аргументом, список теперь `[1, 2]`.
- `res3 = add_to_list(1)` → аргумент `1` есть в кэше, сработает ветка `print("Из кэша")`, и вернётся ссылка на тот же изменённый список.
🔢 Итог:
```
[1, 2]
[1, 2]
Из кэша
[1, 2]
```
Все переменные указывают на один и тот же изменённый список.
💥 Почему это важно:
1️⃣ Изменяемые аргументы по умолчанию сохраняются между вызовами функции.
2️⃣ Кэширование изменяемых объектов может привести к неожиданным результатам: возвращается не неизменяемый результат, а ссылка на объект, который может изменяться позже.
🛡️ Как исправить:
1️⃣ Использовать `lst=None` и создавать новый список внутри функции:
```python
def add_to_list(val, lst=None):
if lst is None:
lst = []
lst.append(val)
return lst
```
2️⃣ Если кэшировать изменяемые объекты, лучше возвращать их копии:
```python
import copy
cache[arg] = copy.deepcopy(result)
```
✅ Итог:
Декораторы вместе с изменяемыми аргументами — это ловушка даже для опытных программистов. Особенно, если изменяемые объекты кэшируются и потом меняются за кулисами.
@Python_Community_ru